/*
在C语言中，函数调用有两种方式：传值调用（Call by value）和传引用调用（Call by reference）。
1:传值调用:
传值调用是指在函数调用的过程中，将实际参数的值复制一份，并传递给对应的形式参数进行使用。
也就是说，在调用函数时，实参的值会被复制到一个新的内存位置中，并作为形参传递给函数。
函数内部对形参的修改不会影响到实参的值。

以下是一个示例代码，展示了传值调用的过程：
*/

#include <stdio.h>

// 声明一个函数swap，用于交换两个数的值
void swap(int x, int y);

int main() {
    int a = 3, b = 5;

    printf("交换前，a=%d,b=%d\n", a, b);

    // 调用函数swap，传递实参a和b的值
    swap(a, b);

    printf("交换后，a=%d,b=%d\n", a, b);
    
    return 0;
}

// 定义函数swap，用于交换两个数的值
void swap(int x, int y) {
    int temp = x;
    x = y;
    y = temp;

    printf("函数内部，x=%d,y=%d\n", x, y);
}
/*
在上述示例中，我们定义了一个函数swap，用于交换两个数的值。
在程序的主函数中，声明了变量a和b，并将它们作为实际参数调用函数swap。
在函数内部，使用了中间变量temp来完成变量值的交换。
需要注意的是，在函数内部修改x和y的值，并不会影响到主函数中变量a和b的值。
*/

/*
2:传引用调用:
传引用调用是指在函数调用的过程中，将实际参数的地址（即指针）传递给对应的形式参数，在函数内部通过指针访问实际参数。
在这种调用方式下，函数内部对形参的修改会直接影响到实参的值。

以下是一个示例代码，展示了传引用调用的过程：
*/

// #include <stdio.h>

// // 声明一个函数swap，用于交换两个数的值
// void swap(int *x, int *y);

// int main() {
//     int a = 3, b = 5;

//     printf("交换前，a=%d,b=%d\n", a, b);

//     // 调用函数swap，传递实参a和b的地址
//     swap(&a, &b);

//     printf("交换后，a=%d,b=%d\n", a, b);

//     return 0;
// }

// // 定义函数swap，用于交换两个数的值
// void swap(int *x, int *y) {
//     int temp = *x;
//     *x = *y;
//     *y = temp;

//     printf("函数内部，x=%d,y=%d\n", *x, *y);
// }

/*
在上述示例中，我们定义了一个函数swap，用于交换两个数的值。
在程序的主函数中，声明了变量a和b，并将它们的地址作为实际参数调用函数swap。
在函数内部，使用了指针x和y来引用实际参数，完成变量值的交换。
需要注意的是，函数内部修改指针x和y所指向的值，会直接影响到主函数中变量a和b的值。

需要注意的是，传引用调用虽然可以直接修改实际参数的值，但也可能会导致指针错误、内存泄漏等问题。
因此应谨慎使用，并遵守良好的编码规范。
*/